# 定义一个结点
class QueueNode:
    def __init__(self):
        self.data = None
        self.next = None


# 定义一个链式队列
class LinkQueue:
    def __init__(self):
        self.MaxQuenceSize = 10
        self.Q = [None for i in range(self.MaxQuenceSize)]
        NewQueueNode = QueueNode()
        self.front = NewQueueNode
        self.rear = NewQueueNode

    # 由用户输入元素将其进队的函数
    def CreateQueueByInput(self):
        data = input("请输入元素(继续输入请按回车，结束输入请按“#”：")
        while data != '#':
            self.EnQueue(data)
            data = input("请输入元素：")

    # 判断队列是否为空的函数
    def IsEmptyQueue(self):
        if self.front == self.rear:
            iQueue = True
        else:
            iQueue = False
        return iQueue

    # 入队的函数
    def EnQueue(self, data):
        NewQueueNode = QueueNode()
        NewQueueNode.data = data
        self.rear.next = NewQueueNode
        self.rear = NewQueueNode
        print("当前进队的元素为：", data)

    # 遍历队列所有元素
    def TraverseQueue(self):
        if self.IsEmptyQueue():
            print("队列为空")
            return
        else:
            print("队列中的元素为：")
            currentNode = self.front.next
            while currentNode != None:
                print(currentNode.data, end=" ")
                currentNode = currentNode.next

    # 获取队头元素
    def GetHead(self):
        if self.IsEmptyQueue():
            print("队列为空")
            return
        else:
            return self.front.next.data

    # 获取队列的长度
    def GetQueueLength(self):
        if self.IsEmptyQueue():
            print("队列为空")
            return
        else:
            print("\n队列的长度为：\n", (self.rear - self.front + self.MaxQuenceSize) % self.MaxQuenceSize)
            return (self.rear - self.front + self.MaxQuenceSize) % self.MaxQuenceSize

    # 出队的函数
    def DeQueue(self):
        if self.IsEmptyQueue():
            print("队列为空")
            return
        elif self.front.next.next == None:
            self.front.next = None
            self.rear = self.front
        else:
            NewQueueNode = self.front.next
            self.front == NewQueueNode.next
            return NewQueueNode.data

# (1)	初始化一个链式队列LinkQueue。
# (2)	判断队列是否为空。
# (3)	将元素1、5、9依次进队。
# (4)	遍历队列所有元素。
# (5)	获取队头元素。
# (6)	获取队列的长度。
# (7)	将队中元素出队并输出

if __name__ == '__main__':
    lq = LinkQueue()
    lq.CreateQueueByInput()
    lq.TraverseQueue()
    print("\n队首元素为->", lq.GetHead())
    print("出队元素为->", lq.DeQueue())
